package com.hmk.blogboot.util;

import org.commonmark.Extension;
import org.commonmark.ext.gfm.tables.TableBlock;
import org.commonmark.ext.gfm.tables.TablesExtension;
import org.commonmark.ext.heading.anchor.HeadingAnchorExtension;
import org.commonmark.node.Link;
import org.commonmark.node.Node;
import org.commonmark.parser.Parser;
import org.commonmark.renderer.html.AttributeProvider;
import org.commonmark.renderer.html.AttributeProviderContext;
import org.commonmark.renderer.html.AttributeProviderFactory;
import org.commonmark.renderer.html.HtmlRenderer;

import java.lang.reflect.Array;
import java.util.*;

/*MarkdownUtils工具类*/
public class MarkdownUtils {

    /*
    * MarkDown格式转换成HTML格式
    *
    * */
    public static String markdownToHtml(String markdown){
        //获取Parser实例对象 Parser用来解析markdown的格式对象
        Parser parser = Parser.builder().build();
        //使用markdown解析对像调用parse（String a）方法 将字符串解析成node对象
        Node document = parser.parse(markdown);
        //获取HtmlRenderer实例 html渲染对象
        HtmlRenderer renderer = HtmlRenderer.builder().build();
        //将markdown note节点 渲染成html
        return  renderer.render(document);
    }

    /*
    *增加的扩展【标题锚点，表格生成】
    *markdown 转换成html
    * */
    public static String markdownToHtmlExtensions(String markdown){
        // Collections.singleton() 返回一个只包含指定对象，只有一个元素，只读的集合
        //HeadingAnchorExtension h标题解析,通过静态方法create()获取对象
        //h标题生成id
        Set<Extension> headingAnchorExtensions =Collections.singleton(HeadingAnchorExtension.create());
        //转换table的HTML TablesExtension表格解析对象
        List<Extension>  tableExtension  = Arrays.asList(TablesExtension.create());
        //markdown解析添加一个tableExtension,表格扩展
        Parser parser = Parser.builder().extensions(tableExtension).build();
        Node document = parser.parse(markdown);
        HtmlRenderer renderer = HtmlRenderer.builder().extensions(tableExtension).attributeProviderFactory(
                new AttributeProviderFactory() {
                    @Override
                    public AttributeProvider create(AttributeProviderContext attributeProviderContext) {
                        //添加或修改标签的属性
                        return new CustomAttributeProvider();
                    }
                }
        ).build();
        return  renderer.render(document);
    }

        //内部类 作用用来修改标签属性 实现接口AttributeProvider 复写setAttributes方法，修改属性
    static class CustomAttributeProvider implements  AttributeProvider{
            @Override
            public void setAttributes(Node node, String s, Map<String, String> map) {
                //改变a标签target属性为_blank
                //如果node 是Link类型 修改属性
                if(node instanceof Link){
                    map.put("target","_blank");
                }
                if(node instanceof TableBlock){
                    map.put("class","ui celled table");
                }
            }
        }

        /*测试*/
        public static void main(String[] args) {
            String table = "| hello | hi   | 哈哈哈   |\n" +
                    "| ----- | ---- | ----- |\n" +
                    "| 斯维尔多  | 士大夫  | f啊    |\n" +
                    "| 阿什顿发  | 非固定杆 | 撒阿什顿发 |\n" +
                    "\n";

            String a ="[imCoding 爱编程](http://www.lirenmi.cn)";
            System.out.println(markdownToHtml(a));
            System.out.println(markdownToHtmlExtensions(table));
        }

}
